﻿Imports System
Imports System.Data
Imports System.Web
Imports gestionHorariosTutorias

Partial Public Class gestionHorariosTutorias
    Inherits System.Web.UI.Page


    '****************************************************************************************
    '************ PROCEDIMIENTOS PRIVADOS PARA USO DESDE EL CONTROL DE EVENTOS **************
    '****************************************************************************************

    'Rellena las opciones del DDLOperaciones por código
    Private Sub rellenar_operaciones()
        'Dim permisos As ArrayList = Session(Comun._VARIABLE_PERMISOS)

        DDLOperaciones.Items.Clear()
        DDLOperaciones.Items.Add(New ListItem("<Seleccione una operación...>", "0"))
        DDLOperaciones.Items.Add(New ListItem("Guardar cambios...", "1"))
        DDLOperaciones.Items.Add(New ListItem("Guardar como nueva version...", "2"))

        DDLOperaciones.DataBind()

    End Sub

    'Crea e inicializa las variables de sesión necesarias
    Private Sub inicializar_variables_sesion()
        'Recogemos la Consulta SQL Diseñada originalmente en el componente y la guardamos
        'En una variable de sesión que sirva de base para el resto de filtros
        Session("ConsultaBasicaHorariosTutorias") = SDSHorariosTeoria.SelectCommand
        Session("FiltroHorariosTutorias") = String.Empty
    End Sub

    'Contruye un filtro SQL a partir de los campos rellenos en la sección de búsquedas
    Private Function contruir_filtro() As String
        Dim builder As New StringBuilder()

        Dim filtro As String = String.Empty

        'Nos quedamos con clases de Teoría sólo
        builder.Append("WHERE HORARIOS.CODIGO_TIPO_CLASE = 'TU'")

        'Si ha elegido algún curso
        If Not DDLCurso.SelectedValue.Equals("todos") Then
            If String.IsNullOrEmpty(filtro) Then
                filtro = " WHERE "
            Else
                builder.Append(" AND HORARIOS.CODIGO_GRUPO=@CODIGO_GRUPO ")
            End If

            '  filtro = filtro & " HORARIOS.CODIGO_GRUPO='" & DDLCurso.SelectedValue() & "'"
        End If

        'Si ha elegido algún Periodo
        If Not DDLPeriodo.SelectedValue.Equals("todos") Then
            If String.IsNullOrEmpty(filtro) Then
                filtro = " WHERE "
            Else
                filtro = filtro & " AND "
                builder.Append(" AND HORARIOS.CODIGO_PERIODO=@CODIGO_PERIODO ")
            End If

            filtro = filtro & " HORARIOS.CODIGO_PERIODO='" & DDLPeriodo.SelectedValue() & "'"
        End If

        Return builder.ToString()
    End Function


    'Permite actualizar el horario que se esté mostrando en pantalla
    'en el momento actual en función de las opciones seleccionadas
    'en los DDL's de la sección de Búsquedas
    Private Sub ConfigurarBusqueda()
        Dim filtro As String = String.Empty

        filtro = contruir_filtro()
        Session("FiltroHorariosTeoria") = filtro

        Dim dtbFranjas As DataTable


        'AQUÍ HABRÍA QUE CODIFICAR LO NECESARIO PARA RECARGAR EL CALENDARIO
        'QUE SE ESTÉ MOSTRANDO

        Dim parametros(1) As SqlClient.SqlParameter

        Try
            parametros(0) = New SqlClient.SqlParameter("curso_academico", SqlDbType.NVarChar, 4)
            parametros(0).Value = DDLCurso.SelectedValue.ToString()
            parametros(1) = New SqlClient.SqlParameter("codigo_turno", SqlDbType.NVarChar, 2)
            parametros(1).Value = "M"
            If Not cConsultas.Obtener_Franjas(dtbFranjas, parametros) Then
                Throw New Exception("Error al obtener las franjas.")
            End If
        Catch ex As Exception
            TBErrorDetalles.Text = filtro & " --> " & ex.ToString()
            HFError_ModalPopupExtender.Show()
        End Try
    End Sub

    'Permite actualizar la consulta select del DataSource asociado a GVListadoAlumnos
    'para ser invocado cada vez que, por algún evento haya que actualizarla
    Private Sub RecargarHorarios()
        'si en ese momento se está trabajando con búsquedas avanzadas
        'se recarga tras un evento
        ConfigurarBusqueda()

    End Sub



    'Rellena la DDLVersion en función del curso académico, titulación y grupo seleccionados
    Private Sub recargar_DDLVersion()

        Dim fecha As Date
        Dim dtbDatos As DataTable
        Try
            'Si no hay ninguna fecha escrita, se pone el lunes de la semana actual
            If String.IsNullOrEmpty(TBFechaLunes.Text) Then
                fecha = Comun.fecha_lunes_semana(Today)
            Else
                fecha = Comun.fecha_lunes_semana(Convert.ToDateTime(TBFechaLunes.Text))
            End If


            Dim parametros(3) As SqlClient.SqlParameter
            parametros(0) = New SqlClient.SqlParameter("CURSO_ACADEMICO", SqlDbType.NVarChar, 4)
            parametros(0).Value = DDLCurso.SelectedValue
            parametros(1) = New SqlClient.SqlParameter("FECHA", SqlDbType.SmallDateTime)
            parametros(1).Value = fecha
            parametros(2) = New SqlClient.SqlParameter("CODIGO_PERIODO", SqlDbType.NVarChar, 2)
            parametros(2).Value = DDLPeriodo.SelectedValue
            parametros(3) = New SqlClient.SqlParameter("CODIGO_TIPO", SqlDbType.NVarChar, 2)
            parametros(3).Value = DDLTipoHorario.SelectedValue
            If Not cConsultas.Obtener_Versiones(dtbDatos, parametros) Then Throw New Exception("Error al obtener las versiones")
            DDLVersion.DataSource = dtbDatos
            DDLVersion.DataTextField = "Numero_Version"
            DDLVersion.DataValueField = "Codigo_Horario"
            DDLVersion.DataBind()
        Catch ex As Exception
            TBErrorDetalles.Text = ex.ToString()
            HFError_ModalPopupExtender.Show()
        End Try

    End Sub


    '****************************************************************************************




    '****************************************************************************************
    '************ PROCEDIMIENTOS DE CONTROL DE EVENTOS **************************************
    '****************************************************************************************

    Private Sub gestionHorariosTeoria_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
        'Ocultamos los paneles de aviso y errores
        'para que no se vean en las recargas de la página
        PnlError.Style.Add("display", "none")
    End Sub

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        'Dim permisos As ArrayList = Session(Comun._VARIABLE_PERMISOS)

        'Comun.establecer_cierre_automatico(Session, Request, Response)

        Try
            'If permisos.Contains("ROL_MODIFICAR_HORARIOS_TUTORIAS") Then
            'Debido a que cuando un contro GridView ordena, cambia de página o cualquier otro evento
            'tras la recarga de la página se pierde cualquier filtro aplicado previamente,
            'en el evento de carga de la página hay que volver a aplicar los filtros almacenados
            'y volver a vincular los datos

            'Si es la primera vez que se carga la página
            If Not (Page.IsPostBack) Then
                'si es la primera vez que se carga la página
                inicializar_variables_sesion()

                Comun.Rellenar_DDLTodosCursos_SinNulos(DDLCurso)
                Comun.Rellenar_DDL_SinNulos(DDLPeriodo, "SELECT CODIGO_PERIODO, DESCRIPCION_PERIODO FROM PERIODOS", _
                                            "CODIGO_PERIODO", "DESCRIPCION_PERIODO")

                Comun.Rellenar_DDL_SinNulos(DDLTipoHorario, "SELECT CODIGO_TIPO_HORARIO, DESCRIPCION_TIPO_HORARIO FROM TIPOS_HORARIO", _
                                      "CODIGO_TIPO_HORARIO", "DESCRIPCION_TIPO_HORARIO")

                recargar_DDLVersion()

                'Ponemos por defecto el lunes de la semana actual
                TBFechaLunes.Text = String.Format("{0:dd/MM/yyyy}", Comun.fecha_lunes_semana(Today))

                rellenar_operaciones()


                Dim dtbPeriodos As DataTable
                If cConsultas.Obtener_periodos(dtbPeriodos) Then
                    DDLPeriodo.DataSource = dtbPeriodos
                    DDLPeriodo.DataTextField = "DESCRIPCION_PERIODO"
                    DDLPeriodo.DataValueField = "CODIGO_PERIODO"
                    DDLPeriodo.DataBind()
                End If
                Dim dtbTurnos As DataTable
                If cConsultas.Obtener_Turnos(dtbTurnos) Then
                    DDLTurno.DataSource = dtbTurnos
                    DDLTurno.DataTextField = "DESCRIPCION_TURNO"
                    DDLTurno.DataValueField = "CODIGO_TURNO"
                    DDLTurno.DataBind()
                End If


            End If
            RecargarHorarios()
            'Else
            '    Comun.salir(Session, Request, Response)
            'End If

            'If Not permisos.Contains("ROL_MODIFICAR_HORARIOS_LABORATORIOS") Then
            '    LBHorariosTeoria.Enabled = False
            'End If

            'If Not permisos.Contains("ROL_MODIFICAR_HORARIOS_TEORIA") Then
            '    LBHorariosTeoria.Enabled = False
            'End If

            'If Not permisos.Contains("ROL_ADMINISTRADOR") Then
            '    LBAdministracion.Visible = False
            'End If
            Enlazar_Datos()




        Catch ex As Exception
            Comun.salir(Session, Request, Response)
        End Try

    End Sub

    Protected Sub DDLCurso_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles DDLCurso.SelectedIndexChanged
        recargar_DDLVersion()
    End Sub

    Protected Sub LBSalir_Click(ByVal sender As Object, ByVal e As EventArgs) Handles LBSalir.Click
        Comun.salir(Session, Request, Response)
    End Sub

    Protected Sub LBErrorDetalles_Click(ByVal sender As Object, ByVal e As EventArgs) Handles LBErrorDetalles.Click
        'Si los detalles están visibles
        If TBErrorDetalles.Visible = True Then
            TBErrorDetalles.Visible = False
            LBErrorDetalles.Text = "Mostar detalles"
        Else 'si están ocultos
            TBErrorDetalles.Visible = True
            LBErrorDetalles.Text = "Ocultar detalles"
        End If
    End Sub
    Sub Enlazar_Datos()
        Dim dtbFranjas As DataTable
        Dim dtbAsignaturas As DataTable
        Dim parametros(1) As SqlClient.SqlParameter
        parametros(0) = New SqlClient.SqlParameter("CODIGO_TURNO", SqlDbType.NVarChar, 2)
        parametros(0).Value = DDLTurno.SelectedValue
        parametros(1) = New SqlClient.SqlParameter("curso_academico", SqlDbType.NVarChar, 4)
        parametros(1).Value = DDLCurso.SelectedValue
        If Not cConsultas.Obtener_Franjas(dtbFranjas, parametros) Then Throw New Exception()
        If Not cConsultas.Obtener_Asignaturas(dtbAsignaturas) Then Throw New Exception()
        Dim tabla As New Table()
        Dim contador As Integer = 1
        tabla.Rows.Add(New TableRow())
        tabla.Rows(0).Cells.Add(New TableCell)
        tabla.Rows(0).Cells.Add(New TableCell)
        tabla.Rows(0).Cells.Add(New TableCell)
        tabla.Rows(0).Cells.Add(New TableCell)
        tabla.Rows(0).Cells.Add(New TableCell)
        tabla.Rows(0).Cells.Add(New TableCell)
        tabla.Rows(0).Cells.Add(New TableCell)
        tabla.Rows(0).Cells(1).Text = "Lunes"
        tabla.Rows(0).Cells(2).Text = "Martes"
        tabla.Rows(0).Cells(3).Text = "Miercoles"
        tabla.Rows(0).Cells(4).Text = "Jueves"
        tabla.Rows(0).Cells(5).Text = "Viernes"
        tabla.Rows(0).Cells(6).Text = "Sabado"
        Dim ddl As New DropDownList
        For Each row As DataRow In dtbFranjas.Rows

            tabla.Rows.Add(New TableRow())
            tabla.Rows(contador).Cells.Add(New TableCell)
            tabla.Rows(contador).Cells.Add(New TableCell)
            tabla.Rows(contador).Cells.Add(New TableCell)
            tabla.Rows(contador).Cells.Add(New TableCell)
            tabla.Rows(contador).Cells.Add(New TableCell)
            tabla.Rows(contador).Cells.Add(New TableCell)
            tabla.Rows(contador).Cells.Add(New TableCell)
            ddl = New DropDownList()
            With ddl
                .Width = 100
                .DataSource = dtbAsignaturas
                .DataTextField = "Nombre"
                .DataValueField = "Codigo_Asignatura"
                .DataBind()
                .ID = String.Format("ddl{0}1", row("CODIGO_FRANJA_HORARIA"))
                .SelectedValue = cConsultas.ObtenerCodigoAsignatura(DDLVersion.SelectedValue, cConsultas.DiaSemana(1), row("CODIGO_FRANJA_HORARIA"))
            End With

            tabla.Rows(contador).Cells(0).Text = row("DESCRIPCION_FRANJA")
            tabla.Rows(contador).Cells(1).Controls.Add(ddl)
            ddl = New DropDownList()
            With ddl
                .Width = 100
                .DataSource = dtbAsignaturas
                .DataTextField = "Nombre"
                .DataValueField = "Codigo_Asignatura"
                .DataBind()
                .ID = String.Format("ddl{0}2", row("CODIGO_FRANJA_HORARIA"))
                .SelectedValue = cConsultas.ObtenerCodigoAsignatura(DDLVersion.SelectedValue, cConsultas.DiaSemana(2), row("CODIGO_FRANJA_HORARIA"))
            End With
            tabla.Rows(contador).Cells(2).Controls.Add(ddl)
            ddl = New DropDownList()
            With ddl
                .Width = 100
                .DataSource = dtbAsignaturas
                .DataTextField = "Nombre"
                .DataValueField = "Codigo_Asignatura"
                .DataBind()
                .ID = String.Format("ddl{0}3", row("CODIGO_FRANJA_HORARIA"))
                .SelectedValue = cConsultas.ObtenerCodigoAsignatura(DDLVersion.SelectedValue, cConsultas.DiaSemana(3), row("CODIGO_FRANJA_HORARIA"))

            End With
            tabla.Rows(contador).Cells(3).Controls.Add(ddl)
            ddl = New DropDownList()
            With ddl
                .Width = 100
                .DataSource = dtbAsignaturas
                .DataTextField = "Nombre"
                .DataValueField = "Codigo_Asignatura"
                .DataBind()
                .ID = String.Format("ddl{0}4", row("CODIGO_FRANJA_HORARIA"))
                .SelectedValue = cConsultas.ObtenerCodigoAsignatura(DDLVersion.SelectedValue, cConsultas.DiaSemana(4), row("CODIGO_FRANJA_HORARIA"))
            End With
            tabla.Rows(contador).Cells(4).Controls.Add(ddl)
            ddl = New DropDownList()
            With ddl
                .Width = 100
                .DataSource = dtbAsignaturas
                .DataTextField = "Nombre"
                .DataValueField = "Codigo_Asignatura"
                .DataBind()
                .ID = String.Format("ddl{0}5", row("CODIGO_FRANJA_HORARIA"))
                .SelectedValue = cConsultas.ObtenerCodigoAsignatura(DDLVersion.SelectedValue, cConsultas.DiaSemana(5), row("CODIGO_FRANJA_HORARIA"))
            End With
            tabla.Rows(contador).Cells(5).Controls.Add(ddl)
            ddl = New DropDownList()
            With ddl
                .Width = 100
                .DataSource = dtbAsignaturas
                .DataTextField = "Nombre"
                .DataValueField = "Codigo_Asignatura"
                .DataBind()
                .ID = String.Format("ddl{0}6", row("CODIGO_FRANJA_HORARIA"))
                .SelectedValue = cConsultas.ObtenerCodigoAsignatura(DDLVersion.SelectedValue, cConsultas.DiaSemana(6), row("CODIGO_FRANJA_HORARIA"))
            End With
            tabla.Rows(contador).Cells(6).Controls.Add(ddl)
            contador += 1
        Next





        For Each row As TableRow In tabla.Rows
            For Each cell As TableCell In row.Cells
                cell.BorderWidth = 1
                cell.BorderColor = Drawing.Color.Black
            Next
        Next
        horario.Controls.Add(tabla)
    End Sub

    Protected Sub DDLPeriodo_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles DDLPeriodo.SelectedIndexChanged
        recargar_DDLVersion()
    End Sub

    Protected Sub DDLPlantillas_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles DDLTipoHorario.SelectedIndexChanged
        recargar_DDLVersion()
    End Sub

    Protected Sub TBFechaLunes_TextChanged(ByVal sender As Object, ByVal e As EventArgs) Handles TBFechaLunes.TextChanged
        Dim fechaUsuario As Date = Date.MinValue
        Dim fecha_lunes As Date = Date.MinValue

        'Dado que en el mismo control del evento TextChanged cambiamos
        'el valor del TextBox, comprobamos que sólo se ejecute como 
        'consecuencia de un evento de usuario (PostBack), porque de lo
        'contrario se mete en un bucle infinito
        If Page.IsPostBack Then

            'Si ha escrito alguna fecha
            If Not String.IsNullOrEmpty(TBFechaLunes.Text) Then
                Try
                    fechaUsuario = Convert.ToDateTime(TBFechaLunes.Text)

                    'Si el día que ha introducido el usuario ya es un lunes
                    If fechaUsuario.DayOfWeek.Equals(DayOfWeek.Monday) Then
                        'No cambiamos nada
                        fecha_lunes = fechaUsuario
                    Else
                        'Lo convertimos en la fecha del lunes de la semana
                        'a la que corresponda el día escrito por el usuario
                        fecha_lunes = Comun.fecha_lunes_semana(fechaUsuario)
                    End If

                    'Lo mostramos bonito :)
                    TBFechaLunes.Text = String.Format("{0:dd/MM/yyyy}", fecha_lunes)

                Catch ex As Exception
                    'No hacemos nada
                End Try
            End If
        End If



    End Sub


    Protected Sub DDLOperaciones_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles DDLOperaciones.SelectedIndexChanged
        Dim tabla As Table = horario.Controls.Cast(Of Table).FirstOrDefault()

        Dim lControles As New List(Of DropDownList)
        For Each row As TableRow In tabla.Rows.Cast(Of TableRow).Skip(1)
            For Each cell As TableCell In row.Cells.Cast(Of TableCell).Skip(1).ToList()
                lControles.Add(cell.Controls.Cast(Of DropDownList).FirstOrDefault)
            Next
        Next
        Select Case DDLOperaciones.SelectedValue
            Case "0" 'Nada
                Exit Sub
            Case "1" 'Guardar Cambios

            Case "2" 'Guardar Nueva Versión
                GuardarNuevaVersion()
        End Select
        If DDLOperaciones.SelectedValue <> "0" Then
            GuardarClases(lControles)
        End If
    End Sub

    Sub GuardarNuevoHorario()
        

    End Sub
    Sub GuardarNuevaVersion()
        Dim intVersion As Integer = 1
        If Not DDLVersion.SelectedItem Is Nothing Then

            If Not String.IsNullOrEmpty(DDLVersion.SelectedItem.Text) Then

                intVersion = CInt(DDLVersion.SelectedItem.Text) + 1
            End If
        End If
        Dim codigoHorario As String = Comun.construye_codigo_horario(DDLCurso.SelectedValue, "TU", DDLPeriodo.SelectedValue, DDLTipoHorario.SelectedValue, intVersion, Convert.ToDateTime(TBFechaLunes.Text), "EGT25")
        Dim parametros(7) As SqlClient.SqlParameter
        parametros(0) = New SqlClient.SqlParameter("HORARIO", SqlDbType.NVarChar, 256)
        parametros(0).Value = codigoHorario
        parametros(1) = New SqlClient.SqlParameter("FECHA", SqlDbType.SmallDateTime)
        parametros(1).Value = Convert.ToDateTime(TBFechaLunes.Text)
        parametros(2) = New SqlClient.SqlParameter("GRUPO", SqlDbType.NVarChar, 10)
        parametros(2).Value = "EGT25"
        parametros(3) = New SqlClient.SqlParameter("VERSION", SqlDbType.Int)
        parametros(3).Value = intVersion
        parametros(4) = New SqlClient.SqlParameter("CLASE", SqlDbType.NVarChar, 2)
        parametros(4).Value = "TU"
        parametros(5) = New SqlClient.SqlParameter("CURSO", SqlDbType.NVarChar, 4)
        parametros(5).Value = DDLCurso.SelectedValue
        parametros(6) = New SqlClient.SqlParameter("PERIODO", SqlDbType.NVarChar, 2)
        parametros(6).Value = DDLPeriodo.SelectedValue
        parametros(7) = New SqlClient.SqlParameter("TIPO_HORARIO", SqlDbType.NVarChar, 2)
        parametros(7).Value = DDLTipoHorario.SelectedValue
        If Not cConsultas.Crear_Nuevo_Horario(parametros) Then Throw New Exception("Sucedio un error al crear el horario.")
        recargar_DDLVersion()

    End Sub
    Sub GuardarClases(ByVal lControles As List(Of DropDownList))
        Dim strHorario As String = DDLVersion.SelectedValue
        Dim parametros(2) As SqlClient.SqlParameter

        Dim franja As Integer
        Dim dia As String
        Try
            ReDim parametros(0)
            parametros(0) = New SqlClient.SqlParameter("HORARIO", SqlDbType.NVarChar, 256)
            parametros(0).Value = strHorario


            cConsultas.Borrar_Registro_Clase(parametros)
            For Each ddl As DropDownList In lControles
                'Comprobamos si existia para eliminarlo
                dia = ddl.ID.Substring(ddl.ID.Length - 1)
                franja = Convert.ToInt32(ddl.ID.Substring(3, ddl.ID.Length - 4))


                If ddl.SelectedValue <> "0" Then
                    ReDim Preserve parametros(5)
                    parametros(0) = New SqlClient.SqlParameter("HORARIO", SqlDbType.NVarChar, 256)
                    parametros(0).Value = strHorario
                    parametros(1) = New SqlClient.SqlParameter("FRANJA", SqlDbType.BigInt)
                    parametros(1).Value = franja
                    parametros(2) = New SqlClient.SqlParameter("DIA", SqlDbType.NVarChar, 2)
                    parametros(2).Value = cConsultas.DiaSemana(dia)

                    parametros(3) = New SqlClient.SqlParameter("curso", SqlDbType.NVarChar, 4)
                    parametros(3).Value = DDLCurso.SelectedValue
                    parametros(4) = New SqlClient.SqlParameter("plan", SqlDbType.NVarChar, 4)
                    parametros(4).Value = cConsultas.Obtener_Plan(ddl.SelectedValue)
                    parametros(5) = New SqlClient.SqlParameter("asignatura", SqlDbType.NVarChar, 4)
                    parametros(5).Value = ddl.SelectedValue
                    'insert into clases(codigo_horario,,codigo_franja_horaria,codigo_dia_semana,curso_academico,codigo_tipo_clase,codigo_comienzo_clase,codigo_grupo, id_usuario,codigo_plan,codigo_asignatura)
                    ' values(@horario,@franja,@dia,@curso,'TU','','EGT25',1,@plan,@asignatura)
                    cConsultas.Crear_Registro_Clase(parametros)
                End If
            Next
        Catch ex As Exception

        End Try
       
    End Sub
End Class